class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode dummy(0, head);

        // 两两一组
        // pre 是上一组的尾节点
        // 当前组 cur 和 cur->next;
        ListNode* pre = &dummy;
        ListNode* cur = head;
        while (cur && cur->next) {
            // 下一组头节点
            ListNode* nxt = cur->next->next;
            // 按顺序连接：pre, cur->next, cur, nxt
            pre->next = cur->next;
            cur->next->next = cur;
            cur->next = nxt;
            // 更新下一组
            pre = cur;
            cur = nxt;
        }

        return dummy.next;
    }
};